/**
 * Se servir de cette fonction pour abonner une fonction à l'événement onLoad d'une page
 * et ce, afin d'éviter qu'une et une seule fonction ne s'approprie cet événement.
 *
 * @param callback func : fonction à abonner
 */
function addLoadEvent(func)
{
   var oldOnLoad = window.onload;
   if(typeof window.onload != 'function')
   {
      window.onload = func;
   }
   else
   {
      window.onload = function()
      {
         oldOnLoad();
         func();
      }
   }
}


function confirmerSuppression()
{
    return confirm("Voulez-vous vraiment supprimer cet enregistrement ?");
}


// A chaque chargement d'une page :
addLoadEvent( function() {
      // ajout d'un message de confirmation pour tous les éléments qui déclenchent
      // une suppression (en fait, les liens ou les boutons qui ont "suppression" pour "name"
      var supp = document.getElementsByName("suppression");
      for(i=0;i<supp.length;i++)
          supp[i].onclick = confirmerSuppression;
});


/**
 * Ouvre un popup centré, dans lequel s'affichera le résultat de l'URL donnée en paramètre,
 * et dont les dimensions sont données par les paramètres largeur et hauteur.
 *
 * @param string url : adresse de la requête
 * @param integer largeur : largeur du popup en pixels
 * @param integer hauteur : hauteur du popup en pixels
 */
function openPopup(url, largeur, hauteur)
{
    window.open(url, 'popup', 'width='+largeur+', height='+hauteur+', modal=yes, scrollbars=yes,'+
                 'left='+((screen.width - largeur)/2) + ',top=' + ((screen.height - hauteur)/2) );
}


/**
 * Actualise la fenêtre mère et ferme le popup (cette fonction
 * doit être appelée depuis le popup lui-même à fermer).
 */
function closePopup()
{
    opener.location.reload();
    window.close();
}


/**
 * Activation de la case à cocher d'une ligne d'un tableau lorsque celle-ci reçoit un clic.
 * Note : la case à cocher doit être la première balise <input> de la ligne.
 *
 * @param string idTable : id du tableau auquel appartiennent les cases à cocher
 */
function markRowsOnClick(idTable)
{
    var table;
    if(idTable !== undefined)
        table = document.getElementById(idTable);
    else
        table = document;

    if(table)
    {
        var rows = table.getElementsByTagName("tr");
        for(var i=0; i<rows.length; i++)
        {
            // on abonne chaque ligne...
            rows[i].onmousedown = function() {
        		    var checkbox = this.getElementsByTagName("input")[0];
        		    if (checkbox && checkbox.type == "checkbox" && ! checkbox.disabled)
                    {
        		        checkbox.checked = ! checkbox.checked;
                        if(checkbox.checked)
                            this.className = this.className + " ligneSel";
                        else
                            this.className = this.className.replace(new RegExp("ligneSel","g"), "");
                    }
                };

            var checkbox = rows[i].getElementsByTagName("input")[0];
            if(checkbox)
            { // ... et on désactive le clic sur les checkbox
                checkbox.onclick = function() {
                    return false;
                };
            }
        }
    }
}


/**
 * Similaire à la fonction 'markRowsOnClick', sauf que cette fonction
 * traite des boutons radio, et non des cases à cocher.
 *
 * @param string idTable : id du tableau auquel appartiennent les boutons radio
 */
function selectRowOnClick(idTable)
{
    var table;
    if(idTable !== undefined)
        table = document.getElementById(idTable);
    else
        table = document;

    if(table)
    {
        var rows = table.getElementsByTagName("tr");

        // fonction qui met à jour la ligne sélectionnée dans le tableau
        // (c'est-à-dire la ligne dont le bouton radio est coché)
        var majSelTab = function() {
                            for(var k=0; k<rows.length; k++)
                            {
                                var radio = rows[k].getElementsByTagName("input")[0];
                                if(radio && radio.type == "radio" && radio.checked)
                                    rows[k].className = rows[k].className + " ligneSel";
                                else
                                    rows[k].className = rows[k].className.replace(new RegExp("ligneSel","g"), "");
                            }
                        };

        for(var i=0; i<rows.length; i++)
        {
            // on abonne chaque ligne...
            rows[i].onmousedown = function() {
                    var radio = this.getElementsByTagName("input")[0];
                    if (radio && radio.type == "radio" && ! radio.disabled)
                    {
                        radio.checked = ! radio.checked;
                        majSelTab();
                    }
                };

            var radio = rows[i].getElementsByTagName("input")[0];
            if(radio)
                radio.onclick = function() {
                      this.checked = true;
                      majSelTab();
                  };
        }
    }
}


/**
 * Coche toutes les cases qui se trouve à l'intérieur du conteneur
 * dont l'id est passé en paramètre.
 *
 * @param string idConteneur
 */
function checkAll(idConteneur)
{
    var conteneur;
    if(idConteneur !== undefined)
        conteneur = document.getElementById(idConteneur);
    else
        conteneur = document;

    var cases = conteneur.getElementsByTagName("input");
    for(var i=0; i<cases.length; i++)
    {
        if(cases[i] && cases[i].type == "checkbox")
            cases[i].checked = true;
    }
}


/**
 * Idem que la fonction 'checkAll', mais sélectionne les lignes du tableau en plus.
 *
 * @param string idConteneur
 */
function markAndCheckAll(idConteneur)
{
    checkAll(idConteneur);
    var conteneur = (idConteneur !== undefined) ? document.getElementById(idConteneur) : document;
    var lignes = conteneur.getElementsByTagName("tr");
    for(var i=0; i<lignes.length; i++)
        if(lignes[i].className.indexOf(" ligneSel") === -1)
            lignes[i].className = lignes[i].className + " ligneSel";

}


/**
 * Décoche toutes les cases qui se trouve à l'intérieur du conteneur
 * dont l'id est passé en paramètre.
 *
 * @param string idConteneur
 */
function uncheckAll(idConteneur)
{
    var conteneur;
    if(idConteneur !== undefined)
        conteneur = document.getElementById(idConteneur);
    else
        conteneur = document;

    var cases = conteneur.getElementsByTagName("input");
    for(var i=0; i<cases.length; i++)
    {
        if(cases[i] && cases[i].type == "checkbox")
            cases[i].checked = false;
    }
}


/**
 * Idem que la fonction 'uncheckAll', mais désélectionne les lignes du tableau en plus.
 *
 * @param string idConteneur
 */
function unmarkAndUncheckAll(idConteneur)
{
    uncheckAll(idConteneur);
    var conteneur = (idConteneur !== undefined) ? document.getElementById(idConteneur) : document;
    var lignes = conteneur.getElementsByTagName("tr");
    for(var i=0; i<lignes.length; i++)
        lignes[i].className = lignes[i].className.replace(new RegExp("ligneSel","g"), "");
}


/**
 * Permet de sélectionner une option dans une liste déroulante
 * en passant le libellé de l'option en paramètre.
 * (si le libellé n'est pas dans la liste, l'option sélectionnée reste la même)
 *
 * @param string select : id de la balise 'select'
 * @param string text  : libellé de l'option à sélectionner
 */
function selectOptionByText(select, text)
{
    var selectTag = document.getElementById(select);
    var options = selectTag.options;
    for(var i=0; i<options.length; i++)
    {
        if(options[i].innerHTML == text)
        {
            selectTag.selectedIndex = i;
            break;
        }
    }
}


/**
 * Permet de sélectionner une option dans une liste déroulante
 * en passant la valeur de l'option en paramètre.
 * (si aucune option ne possède cette valeur, l'option sélectionnée reste la même)
 *
 * @param string select : id de la balise 'select'
 * @param string value  : valeur de l'option à sélectionner
 */
function selectOptionByValue(select, value)
{
    var selectTag = document.getElementById(select);
    var options = selectTag.options;
    for(var i=0; i<options.length; i++)
    {
        if(options[i].value == value)
        {
            selectTag.selectedIndex = i;
            break;
        }
    }
}


/**
 * Endort le script pendant la durée passée en paramètre.
 *
 * @param integer millisec : nombre de millisecondes durant lesquelles
 *                           le script doit être "endormi".
 */
function sleep(millisec)
{
    var now = new Date();
    var exitTime = now.getTime() + millisec;

    while(true)
    {
        now = new Date();
        if(now.getTime() > exitTime)
            return;
    }
}


/**
 * Enlève les blancs en début et en fin de chaîne.
 *
 * @param string str : chaîne à nettoyer
 *
 * @return string : chaîne nettoyée
 */
function trim(str)
{
    return str.replace(/^\s+/, '').replace(/\s+$/, '');
}
